# -*- coding: utf-8 -*-
"""
 I-CHING package
 by  https://github.com/SHMoney2021

 周易蓍草占卜过程：
    大衍之数五十，其用四十有九。分而为二以象两，挂一以象三，揲之以四以象四时，归奇于扐以象闰；\
    五岁再闰，故再扐而后挂。天数五，地数五。五位相得而各有合。天数二十有五，地数三十，凡天地之数五十有五。\
    此所以成变化而行鬼神也。乾之策二百一十有六，坤之策百四十有四，凡三百有六十，当期之日。\
    二篇之策，万有一千五百二十，当万物之数也。是故四营而成《易》，十有八变而成卦，八卦而小成。\
    引而伸之，触类而长之，天下之能事毕矣。显道神德行，是故可与酬酢，可与祐神矣。\
    子曰：“知变化之道者，其知神之所为乎？”
 解析：
    三变得一爻，十八变得一卦，为本卦，本卦老阳老阴爻变得到变卦，本卦+变卦即为占卜结果
    得到一爻的过程：(50 - 1) - [5, 9] - [4, 8] - [4, 8] = [24, 28, 32, 36]
 本代码占卜流程示例(泰 之 颐)：
    1. 按初爻到上爻顺序算得本卦 [7, 9, 9, 8, 8, 6]，从而变卦为 [7, 6, 6, 8, 8, 9]
    2. 本卦变换为字符串'111000'，外卦'000'为地， 内卦'111'为天，查表'111000'得到本卦卦名 '泰'
    3. 变卦变换为字符串'100001'，外卦'001'为山， 内卦'100'为雷，查表'100001'得到变卦卦名 '颐'
    4. 因此占卜结果为：泰 之 颐
    5. 根据变爻选择判词(7种情况之一)
 todo list:
    1. 图形化占卜过程（动态图像显示蓍草占卜全过程）
    2. 优化数据结构
    3. 添加通过网络展示功能
"""
import time
from collections import Counter
from random import randint
import numpy as np
from turtle import *

# IChing类 - 封装占卜操作
class IChing():
    # 算得本卦及变卦
    # 结果：['011011', '111001']
    @staticmethod
    def get_guas() -> list:
        # 按初爻到上爻顺序算得本卦
        gua = [IChing._get_yao() for x in range(6)]
        gua_b = ''.join([str(x % 2) for x in gua])
        # 按初爻到上爻顺序算得变卦
        BIAN69 = {6: 9, 9: 6, 7: 7, 8: 8}
        gua2 = [BIAN69[x] for x in gua]
        gua_c = ''.join([str(x % 2) for x in gua2])
        return [gua_b, gua_c]

    # 查询卦名
    # 结果：'巽'
    @staticmethod
    def get_gua_name(gua) -> str:
        return IChingData.gua_name(gua)

    # 查询卦象
    # 结果：'风风'
    @staticmethod
    def get_gua_xiang(gua) -> str:
        return IChingData.gua_xiang(gua)

    # 根据本卦及变卦得到占卜结果
    # 结果采用朱熹总结的七种情况返回卦辞或爻辞
    @staticmethod
    def get_results(gua_b, gua_c) -> list:
        # 本卦
        result_guas = IChing.get_gua_name(gua_b)
        # 变卦
        if gua_b != gua_c:
            result_guas += ' 之 ' + IChing.get_gua_name(gua_c)
        # 判辞
        result_text = IChing._get_gua_ci(gua_b, gua_c)
        return [result_guas, result_text]

    # 算得一变
    # 结果：1st[5, 9] 2nd[4, 8] 3rd[4, 8]
    @staticmethod
    def _get_bian(shicao_nums) -> int:
        # 限定在中间值[-10, 10]之间模拟实际占卜过程，实际中随意两分不会差异太大
        # tian_num = randint(shicao_nums // 2 - 10, shicao_nums // 2 + 10)
        tian_num = randint(1, shicao_nums - 2)
        di_num = shicao_nums - tian_num
        di_num -= 1
        tian_num = tian_num % 4
        if tian_num == 0:
            tian_num = 4
        di_num = di_num % 4
        if di_num == 0:
            di_num = 4
        return tian_num + di_num + 1

    # 算得一爻
    # 结果: [6, 7, 8, 9]
    @staticmethod
    def _get_yao() -> int:
        shicao_nums = 50
        shicao_nums -= 1
        # 三变得一爻
        bian1st = IChing._get_bian(shicao_nums)
        assert bian1st in [5, 9]
        shicao_nums -= bian1st
        bian2nd = IChing._get_bian(shicao_nums)
        assert bian2nd in [4, 8]
        shicao_nums -= bian2nd
        bian3rd = IChing._get_bian(shicao_nums)
        assert bian3rd in [4, 8]
        shicao_nums -= bian3rd
        assert shicao_nums in [24, 28, 32, 36]
        return shicao_nums // 4

    # 卦辞爻辞
    @staticmethod
    def _get_gua_ci(gua_b, gua_c) -> str:
        gua, yao = IChing._get_yao_pos(gua_b, gua_c)
        return IChingData.gua_ci(gua, yao)

    # 变爻 用朱熹总结的七种情况得到占卜判辞
    @staticmethod
    def _get_yao_pos(gua_b, gua_c) -> list:
        L = []
        for i in range(6):
            if gua_b[i] != gua_c[i]:
                L.append(i+1)
        n = len(L)
        # 0变爻 - 本卦卦辞
        if n == 0:
            return [gua_b, 0]
        # 1变爻 - 本卦变爻爻辞
        elif n == 1:
            return [gua_b, L[0]]
        # 2变爻 - 本卦靠上变爻爻辞
        elif n == 2:
            return [gua_b, L[1]]
        # 3变爻 - 本卦卦辞
        elif n == 3:
            return [gua_b, 0]
        # 4变爻 - 变卦靠上不变爻爻辞
        elif n == 4:
            return [gua_c, [x for x in range(1, 7) if x not in L][1]]
        # 5变爻 - 变卦不变爻爻辞
        elif n == 5:
            return [gua_c, [x for x in range(1, 7) if x not in L][0]]
        # 6变爻 - 乾卦坤卦用九 其它变卦卦辞
        elif n == 6:
            if gua_b == '111111' or gua_b == '000000':
                return [gua_b, 7]
            else:
                return [gua_c, 0]


# IChingData类 - 封装卦爻数据
class IChingData():
    DICT_GUA2NAME = {'111111': '乾', '000000': '坤', '100010': '屯', '010001': '蒙', '111010': '需', '010111': '讼',
                     '010000': '师', '000010': '比', '111011': '小畜', '110111': '履', '111000': '泰', '000111': '否',
                     '101111': '同人', '111101': '大有', '001000': '谦', '000100': '豫', '100110': '随', '011001': '蛊',
                     '110000': '临', '000011': '观', '100101': '噬嗑', '101001': '贲', '000001': '剥', '100000': '复',
                     '100111': '无妄', '111001': '大畜', '100001': '颐', '011110': '大过', '010010': '坎', '101101': '离',
                     '001110': '咸', '011100': '恒', '001111': '遯', '111100': '大壮', '000101': '晋', '101000': '明夷',
                     '101011': '家人', '110101': '睽', '001010': '蹇', '010100': '解', '110001': '损', '100011': '益',
                     '111110': '夬', '011111': '姤', '000110': '萃', '011000': '升', '010110': '困', '011010': '井',
                     '101110': '革', '011101': '鼎', '100100': '震', '001001': '艮', '001011': '渐', '110100': '归妹',
                     '101100': '丰', '001101': '旅', '011011': '巽', '110110': '兑', '010011': '涣', '110010': '节',
                     '110011': '中孚', '001100': '小过', '101010': '既济', '010101': '未济'}

    DICT_GUA2XIANG = {'111111': '天天', '000000': '地地', '100010': '水雷', '010001': '山水', '111010': '水天', '010111': '天水',
                      '010000': '地水', '000010': '水地', '111011': '风天', '110111': '天泽', '111000': '地天', '000111': '天地',
                      '101111': '天火', '111101': '火天', '001000': '地山', '000100': '雷地', '100110': '泽雷', '011001': '山风',
                      '110000': '地泽', '000011': '风地', '100101': '火雷', '101001': '山火', '000001': '山地', '100000': '地雷',
                      '100111': '天雷', '111001': '山天', '100001': '山雷', '011110': '泽风', '010010': '水水', '101101': '火火',
                      '001110': '泽山', '011100': '雷风', '001111': '天山', '111100': '雷天', '000101': '火地', '101000': '地火',
                      '101011': '风火', '110101': '火泽', '001010': '水山', '010100': '雷水', '110001': '山泽', '100011': '风雷',
                      '111110': '泽天', '011111': '天风', '000110': '泽地', '011000': '地风', '010110': '泽水', '011010': '水风',
                      '101110': '泽火', '011101': '火风', '100100': '雷雷', '001001': '山山', '001011': '风山', '110100': '雷泽',
                      '101100': '雷火', '001101': '火山', '011011': '风风', '110110': '泽泽', '010011': '风水', '110010': '水泽',
                      '110011': '风泽', '001100': '雷山', '101010': '水火', '010101': '火水'}

    # 卦辞、爻辞查询
    # {卦: {0卦辞 1-6爻辞 7乾坤卦用九用六}}
    DICT_GUA2TEXT = {'111111': {0: '乾：元亨，利贞。', 1: '初九：潜龙，勿用。', 2: '九二：见龙在田，利见大人。', 3: '九三：君子终日乾乾，夕惕若，厉，无咎。', 4: '九四：或跃在渊，无咎。', 5: '九五：飞龙在天，利见大人。', 6: '上九：亢龙有悔。', 7: '用九：见群龙无首，吉。'},
                     '000000': {0: '坤：元亨，利牝马之贞。君子有攸往，先迷后得主，利西南得朋，东北丧朋。安贞，吉。', 1: '初六：履霜，坚冰至。', 2: '六二：直，方，大，不习无不利。', 3: '六三：含章可贞。或从王事，无成有终。', 4: '六四：括囊；无咎，无誉。', 5: '六五：黄裳，元吉。', 6: '上六：龙战于野，其血玄黄。', 7: '用六：利永贞。'},
                     '100010': {0: '屯：元亨，利贞，勿用有攸往，利建侯。', 1: '初九：磐桓；利居贞，利建侯。', 2: '六二：屯如邅如，乘马班如。匪寇婚媾，女子贞不字，十年乃字。', 3: '六三：即鹿无虞，惟入于林中，君子几不如舍，往吝。', 4: '六四：乘马班如，求婚媾，往吉，无不利。', 5: '九五：屯其膏，小贞吉，大贞凶。', 6: '上六：乘马班如，泣血涟如。'},
                     '010001': {0: '蒙：亨。匪我求童蒙，童蒙求我。初筮告，再三渎，渎则不告。利贞。', 1: '初六：发蒙，利用刑人，用说桎梏，以往吝。', 2: '九二：包蒙吉；纳妇吉；子克家。', 3: '六三：勿用取女；见金夫，不有躬，无攸利。', 4: '六四：困蒙，吝。', 5: '六五：童蒙，吉。', 6: '上九：击蒙；不利为寇，利御寇。'}, '111010': {0: '需：有孚，光亨，贞吉。利涉大川。', 1: '初九：需于郊。利用恒，无咎。', 2: '九二：需于沙。小有言，终吉。', 3: '九三：需于泥，致寇至。', 4: '六四：需于血，出自穴。', 5: '九五：需于酒食，贞吉。', 6: '上六：入于穴，有不速之客三人来，敬之终吉。'}, '010111': {0: '讼：有孚，窒。惕中吉。终凶。利见大人，不利涉大川。', 1: '初六：不永所事，小有言，终吉。', 2: '九二：不克讼，归而逋，其邑人三百户，无眚。', 3: '六三：食旧德，贞厉，终吉，或从王事，无成。', 4: '九四：不克讼，复即命渝，安贞吉。', 5: '九五：讼元吉。', 6: '上九：或锡之鞶带，终朝三褫之。'}, '010000': {0: '师：贞，丈人，吉无咎。', 1: '初六：师出以律，否臧凶。', 2: '九二：在师中吉，无咎，王三锡命。', 3: '六三：师或舆尸，凶。', 4: '六四：师左次，无咎。', 5: '六五：田有禽，利执言，无咎。长子帅师，弟子舆尸，贞凶。', 6: '上六：大君有命，开国承家，小人勿用。'}, '000010': {0: '比：吉。原筮元永贞，无咎。不宁方来，后夫凶。', 1: '初六：有孚，比之，无咎。有孚盈缶，终来有它吉。', 2: '六二：比之自内，贞吉。', 3: '六三：比之匪人。', 4: '六四：外比之，贞吉。', 5: '九五：显比，王用三驱，失前禽。邑人不诫，吉。', 6: '上六：比之无首，凶。'}, '111011': {0: '小畜：亨。密云不雨，自我西郊。', 1: '初九：复自道，何其咎，吉。', 2: '九二：牵复，吉。', 3: '九三：舆说辐，夫妻反目。', 4: '六四：有孚，血去惕出，无咎。', 5: '九五：有孚挛如，富以其邻。', 6: '上九：既雨既处，尚德载，妇贞厉。月几望，君子征凶。'}, '110111': {0: '履虎尾，不咥人，亨。', 1: '初九：素履，往无咎。', 2: '九二：履道坦坦，幽人贞吉。', 3: '六三：眇能视，跛能履，履虎尾，咥人，凶。武人为于大君。', 4: '九四：履虎尾，诉诉，终吉。', 5: '九五：夬履，贞厉。', 6: '上九：视履考祥，其旋元吉。'}, '111000': {0: '泰：小往大来，吉亨。', 1: '初九：拔茅茹，以其汇，征吉。', 2: '九二：包荒，用冯河，不遐遗，朋亡，得尚于中行。', 3: '九三：无平不陂，无往不复，艰贞无咎。勿恤其孚，于食有福。', 4: '六四：翩翩，不富，以其邻，不戒以孚。', 5: '六五：帝乙归妹，以祉元吉。', 6: '上六：城复于隍，勿用师。自邑告命，贞吝。'}, '000111': {0: '否之匪人，不利君子贞，大往小来。', 1: '初六：拔茅茹，以其汇，贞吉亨。', 2: '六二：包承。小人吉，大人否，亨。', 3: '六三：包羞。', 4: '九四：有命，无咎，畴离祉。', 5: '九五：休否，大人吉。其亡其亡，系于苞桑。', 6: '上九：倾否，先否后喜。'}, '101111': {0: '同人于野，亨。利涉大川，利君子贞。', 1: '初九：同人于门，无咎。', 2: '六二：同人于宗，吝。', 3: '九三：伏戎于莽，升其高陵，三岁不兴。', 4: '九四：乘其墉，弗克攻，吉。', 5: '九五：同人，先号啕而后笑。大师克相遇。', 6: '上九：同人于郊，无悔。'}, '111101': {0: '大有：元亨。', 1: '初九：无交害，匪咎，艰则无咎。', 2: '九二：大车以载，有攸往，无咎。', 3: '九三：公用亨于天子，小人弗克。', 4: '九四：匪其彭，无咎。', 5: '六五：厥孚交如，威如；吉。', 6: '上九：自天佑之，吉无不利。'}, '001000': {0: '谦：亨，君子有终。', 1: '初六：谦谦君子，用涉大川，吉。', 2: '六二：鸣谦，贞吉。', 3: '九三：劳谦，君子有终，吉。', 4: '六四：无不利，撝谦。', 5: '六五：不富，以其邻，利用侵伐，无不利。', 6: '上六：鸣谦，利用行师，征邑国。'}, '000100': {0: '豫：利建侯，行师。', 1: '初六：鸣豫，凶。', 2: '六二：介于石，不终日，贞吉。', 3: '六三：盱豫，悔。迟有悔。', 4: '九四：由豫，大有得。勿疑。朋盍簪。', 5: '六五：贞疾，恒不死。', 6: '上六：冥豫，成有渝，无咎。'}, '100110': {0: '随：元亨利贞，无咎。', 1: '初九：官有渝，贞吉。出门交有功。', 2: '六二：系小子，失丈夫。', 3: '六三：系丈夫，失小子。随有求得，利居贞。', 4: '九四：随有获，贞凶。有孚在道，以明，何咎。', 5: '九五：孚于嘉，吉。', 6: '上六：拘系之，乃从维之。王用亨于西山。'}, '011001': {0: '蛊：元亨，利涉大川。先甲三日，后甲三日。', 1: '初六：干父之蛊，有子，考无咎，厉终吉。', 2: '九二：干母之蛊，不可贞。', 3: '九三：干父之蛊，小有悔，无大咎。', 4: '六四：裕父之蛊，往见吝。', 5: '六五：干父之蛊，用誉。', 6: '上九：不事王侯，高尚其事。'}, '110000': {0: '临：元，亨，利，贞。至于八月有凶。', 1: '初九：咸临，贞吉。', 2: '九二：咸临，吉无不利。', 3: '六三：甘临，无攸利。既忧之，无咎。', 4: '六四：至临，无咎。', 5: '六五：知临，大君之宜，吉。', 6: '上六：敦临，吉无咎。'}, '000011': {0: '观：盥而不荐，有孚顒若。', 1: '初六：童观，小人无咎，君子吝。', 2: '六二：闚观，利女贞。', 3: '六三：观我生，进退。', 4: '六四：观国之光，利用宾于王。', 5: '九五：观我生，君子无咎。', 6: '上九：观其生，君子无咎。'}, '100101': {0: '噬嗑：亨。利用狱。', 1: '初九：屦校灭趾，无咎。', 2: '六二：噬肤灭鼻，无咎。', 3: '六三：噬腊肉，遇毒；小吝，无咎。', 4: '九四：噬乾胏，得金矢，利艰贞，吉。', 5: '六五：噬乾肉，得黄金，贞厉，无咎。', 6: '上九：何校灭耳，凶。'}, '101001': {0: '贲：亨。小利有攸往。', 1: '初九：贲其趾，舍车而徒。', 2: '六二：贲其须。', 3: '九三：贲如濡如，永贞吉。', 4: '六四：贲如皤如，白马翰如，匪寇婚媾。', 5: '六五：贲于丘园，束帛戋戋，吝，终吉。', 6: '上九：白贲，无咎。'}, '000001': {0: '剥：不利有攸往。', 1: '初六：剥床以足，蔑贞凶。', 2: '六二：剥床以辨，蔑贞凶。', 3: '六三：剥之，无咎。', 4: '六四：剥床以肤，凶。', 5: '六五：贯鱼，以宫人宠，无不利。', 6: '上九：硕果不食，君子得舆，小人剥庐。'}, '100000': {0: '复：亨。出入无疾，朋来无咎。反复其道，七日来复，利有攸往。', 1: '初九：不远复，无祗悔，元吉。', 2: '六二：休复，吉。', 3: '六三：频复，厉无咎。', 4: '六四：中行独复。', 5: '六五：敦复，无悔。', 6: '上六：迷复，凶，有灾眚。用行师，终有大败，以其国君，凶；至于十年，不克征。'}, '100111': {0: '无妄：元亨，利贞。其匪正有眚，不利有攸往。', 1: '初九：无妄，往吉。', 2: '六二：不耕获，不灾畲，则利有攸往。', 3: '六三：无妄之灾，或系之牛，行人之得，邑人之灾。', 4: '九四：可贞，无咎。', 5: '九五：无妄之疾，勿药有喜。', 6: '上九：无妄，行有眚，无攸利。'}, '111001': {0: '大畜：利贞，不家食吉，利涉大川。', 1: '初九：有厉利已。', 2: '九二：舆说輹。', 3: '九三：良马逐，利艰贞。曰闲舆卫，利有攸往。', 4: '六四：童牛之牿，元吉。', 5: '六五：豶豕之牙，吉。', 6: '上九：何天之衢，亨。'}, '100001': {0: '颐：贞吉。观颐，自求口实。', 1: '初九：舍尔灵龟，观我朵颐，凶。', 2: '六二：颠颐，拂经，于丘颐，征凶。', 3: '六三：拂颐，贞凶，十年勿用，无攸利。', 4: '六四：颠颐，吉，虎视眈眈，其欲逐逐，无咎。', 5: '六五：拂经，居贞吉，不可涉大川。', 6: '上九：由颐，厉吉，利涉大川。'}, '011110': {0: '大过：栋桡，利有攸往，亨。', 1: '初六：藉用白茅，无咎。', 2: '九二：枯杨生稊，老夫得其女妻，无不利。', 3: '九三：栋桡，凶。', 4: '九四：栋隆，吉；有它吝。', 5: '九五：枯杨生华，老妇得士夫，无咎无誉。', 6: '上六：过涉灭顶，凶，无咎。'}, '010010': {0: '坎：习坎，有孚，维心亨，行有尚。', 1: '初六：习坎，入于坎窞，凶。', 2: '九二：坎有险，求小得。', 3: '六三：来之坎坎，险且枕，入于坎窞，勿用。', 4: '六四：樽酒簋贰，用缶，纳约自牖，终无咎。', 5: '九五：坎不盈，祗既平，无咎。', 6: '上六：系用徽纆，置于丛棘，三岁不得，凶。'}, '101101': {0: '离：利贞，亨。畜牝牛，吉。', 1: '初九：履错然，敬之无咎。', 2: '六二：黄离，元吉。', 3: '九三：日昃之离，不鼓缶而歌，则大耋之嗟，凶。', 4: '九四：突如其来如，焚如，死如，弃如。', 5: '六五：出涕沱若，戚嗟若，吉。', 6: '上九：王用出征，有嘉折首，获匪其丑，无咎。'}, '001110': {0: '咸，亨，利贞，取女吉。', 1: '初六，咸其拇。', 2: '六二，咸其腓，凶，居吉。', 3: '九三，咸其股，执其随，往吝。', 4: '九四，贞吉，悔亡，憧憧往来，朋从尔思。', 5: '九五，咸其脢，无悔。', 6: '上六，咸其辅颊舌。'}, '011100': {0: '恒：亨，无咎，利贞，利有攸往。', 1: '初六：浚恒，贞凶，无攸利。', 2: '九二：悔亡。', 3: '九三：不恒其德，或承之羞，贞吝。', 4: '九四：田无禽。', 5: '六五：恒其德，贞，妇人吉，夫子凶。', 6: '上六：振恒，凶。'}, '001111': {0: '遯：亨，小利贞。', 1: '初六：遯尾，厉，勿用有攸往。', 2: '六二：执之用黄牛之革，莫之胜说。', 3: '九三：系遯，有疾厉，畜臣妾吉。', 4: '九四：好遯，君子吉，小人否。', 5: '九五：嘉遯，贞吉。', 6: '上九：肥遯，无不利。'}, '111100': {0: '大壮：利贞。', 1: '初九：壮于趾，征凶，有孚。', 2: '九二：贞吉。', 3: '九三：小人用壮，君子用罔，贞厉。羝羊触藩，羸其角。', 4: '九四：贞吉悔亡，藩决不羸，壮于大舆之輹。', 5: '六五：丧羊于易，无悔。', 6: '上六：羝羊触藩，不能退，不能遂，无攸利，艰则吉。'}, '000101': {0: '晋：康侯用锡马蕃庶，昼日三接。', 1: '初六：晋如，摧如，贞吉。罔孚，裕无咎。', 2: '六二：晋如，愁如，贞吉。受兹介福，于其王母。', 3: '六三：众允，悔亡。', 4: '九四：晋如硕鼠，贞厉。', 5: '六五：悔亡，失得勿恤，往吉，无不利。', 6: '上九：晋其角，维用伐邑，厉吉无咎，贞吝。'}, '101000': {0: '明夷：利艰贞。', 1: '初九：明夷于飞，垂其翼。君子于行，三日不食，有攸往，主人有言。', 2: '六二：明夷，夷于左股，用拯马壮，吉。', 3: '九三：明夷于南狩，得其大首，不可疾贞。', 4: '六四：入于左腹，获明夷之心，出于门庭。', 5: '六五：箕子之明夷，利贞。', 6: '上六：不明晦，初登于天，后入于地。'}, '101011': {0: '家人：利女贞。', 1: '初九：闲有家，悔亡。', 2: '六二：无攸遂，在中馈，贞吉。', 3: '九三：家人嗃嗃，悔厉吉；妇子嘻嘻，终吝。', 4: '六四：富家，大吉。', 5: '九五：王假有家，勿恤，往吉。', 6: '上九：有孚威如，终吉。'}, '110101': {0: '睽：小事吉。', 1: '初九：悔亡，丧马勿逐，自复；见恶人无咎。', 2: '九二：遇主于巷，无咎。', 3: '六三：见舆曳，其牛掣，其人天且劓，无初有终。', 4: '九四：睽孤，遇元夫，交孚，厉无咎。', 5: '六五：悔亡，厥宗噬肤，往何咎。', 6: '上九：睽孤，见豕负涂，载鬼一车，先张之弧，后说之弧，匪寇婚媾，往遇雨则吉。'}, '001010': {0: '蹇：利西南，不利东北；利见大人，贞吉。', 1: '初六：往蹇，来誉。', 2: '六二：王臣蹇蹇，匪躬之故。', 3: '九三：往蹇来反。', 4: '六四：往蹇来连。', 5: '九五：大蹇朋来。', 6: '上六：往蹇来硕，吉；利见大人。'}, '010100': {0: '解：利西南，无所往，其来复吉。有攸往，夙吉。', 1: '初六：无咎。', 2: '九二：田获三狐，得黄矢，贞吉。', 3: '六三：负且乘，致寇至，贞吝。', 4: '九四：解而拇，朋至斯孚。', 5: '六五：君子维有解，吉；有孚于小人。', 6: '上六：公用射隼于高墉之上，获之，无不利。'}, '110001': {0: '损：有孚，元吉，无咎，可贞，利有攸往。曷之用，二簋可用享。', 1: '初九：巳事遄往，无咎，酌损之。', 2: '九二：利贞，征凶，弗损，益之。', 3: '六三：三人行，则损一人；一人行，则得其友。', 4: '六四：损其疾，使遄有喜，无咎。', 5: '六五：或益之，十朋之龟弗克违，元吉。', 6: '上九：弗损益之，无咎，贞吉，有攸往，得臣无家。'}, '100011': {0: '益：利有攸往，利涉大川。', 1: '初九：利用为大作，元吉，无咎。', 2: '六二：或益之，十朋之龟弗克违，永贞吉。王用享于帝，吉。', 3: '六三：益之用凶事，无咎。有孚中行，告公用圭。', 4: '六四：中行，告公从。利用为依迁国。', 5: '九五：有孚惠心，勿问元吉。有孚惠我德。', 6: '上九：莫益之，或击之，立心勿恒，凶。'}, '111110': {0: '夬：扬于王庭，孚号，有厉，告自邑，不利即戎，利有攸往。', 1: '初九：壮于前趾，往不胜为咎。', 2: '九二：惕号，莫夜有戎，勿恤。', 3: '九三：壮于頄，有凶。君子夬夬，独行，遇雨，若濡，有愠，无咎。', 4: '九四：臀无肤，其行次且。牵羊悔亡，闻言不信。', 5: '九五：苋陆夬夬，中行无咎。', 6: '上六：无号，终有凶。'}, '011111': {0: '姤：女壮，勿用取女。', 1: '初六：系于金柅，贞吉，有攸往，见凶，羸豕孚蹢躅。', 2: '九二：包有鱼，无咎，不利宾。', 3: '九三：臀无肤，其行次且，厉，无大咎。', 4: '九四：包无鱼，起凶。', 5: '九五：以杞包瓜，含章，有陨自天。', 6: '上九：姤其角，吝，无咎。'}, '000110': {0: '萃：亨。王假有庙，利见大人，亨，利贞。用大牲吉，利有攸往。', 1: '初六：有孚不终，乃乱乃萃，若号一握为笑，勿恤，往无咎。', 2: '六二：引吉，无咎，孚乃利用禴。', 3: '六三：萃如，嗟如，无攸利，往无咎，小吝。', 4: '九四：大吉，无咎。', 5: '九五：萃有位，无咎。匪孚，元永贞，悔亡。', 6: '上六：赍咨涕洟，无咎。'}, '011000': {0: '升：元亨，用见大人，勿恤，南征吉。', 1: '初六：允升，大吉。', 2: '九二：孚乃利用禴，无咎。', 3: '九三：升虚邑。', 4: '六四：王用亨于岐山，吉无咎。', 5: '六五：贞吉，升阶。', 6: '上六：冥升，利于不息之贞。'}, '010110': {0: '困：亨，贞，大人吉，无咎，有言不信。', 1: '初六：臀困于株木，入于幽谷，三岁不觌。', 2: '九二：困于酒食，朱绂方来，利用享祀，征凶，无咎。', 3: '六三：困于石，据于蒺蔾，入于其宫，不见其妻，凶。', 4: '九四：来徐徐，困于金车，吝，有终。', 5: '九五：劓刖，困于赤绂，乃徐有说，利用祭祀。', 6: '上六：困于葛藟，于臲卼，曰动悔。有悔，征吉。'}, '011010': {0: '井：改邑不改井，无丧无得，往来井井。汔至，亦未繘井，羸其瓶，凶。', 1: '初六：井泥不食，旧井无禽。', 2: '九二：井谷射鲋，瓮敝漏。', 3: '九三：井渫不食，为我心恻，可用汲，王明，并受其福。', 4: '六四：井甃，无咎。', 5: '九五：井冽，寒泉食。', 6: '上六：井收勿幕，有孚元吉。'}, '101110': {0: '革：巳日乃孚，元亨利贞，悔亡。', 1: '初九：巩用黄牛之革。', 2: '六二：巳日乃革之，征吉，无咎。', 3: '九三：征凶，贞厉，革言三就，有孚。', 4: '九四：悔亡，有孚改命，吉。', 5: '九五：大人虎变，未占有孚。', 6: '上六：君子豹变，小人革面，征凶，居贞吉。'}, '011101': {0: '鼎：元吉，亨。', 1: '初六：鼎颠趾，利出否，得妾以其子，无咎。', 2: '九二：鼎有实，我仇有疾，不我能即，吉。', 3: '九三：鼎耳革，其行塞，雉膏不食，方雨亏悔，终吉。', 4: '九四：鼎折足，覆公餗，其形渥，凶。', 5: '六五：鼎黄耳，金铉，利贞。', 6: '上九：鼎玉铉，大吉，无不利。'}, '100100': {0: '震：亨。震来虩虩，笑言哑哑。震惊百里，不丧匕鬯。', 1: '初九：震来虩虩，后笑言哑哑，吉。', 2: '六二：震来厉，亿丧贝，跻于九陵，勿逐，七日得。', 3: '六三：震苏苏，震行无眚。', 4: '九四：震遂泥。', 5: '六五：震往来厉，亿无丧，有事。', 6: '上六：震索索，视矍矍，征凶。震不于其躬，于其邻，无咎。婚媾有言。'}, '001001': {0: '艮：艮其背，不获其身，行其庭，不见其人，无咎。', 1: '初六：艮其趾，无咎，利永贞。', 2: '六二：艮其腓，不拯其随，其心不快。', 3: '九三：艮其限，列其夤，厉薰心。', 4: '六四：艮其身，无咎。', 5: '六五：艮其辅，言有序，悔亡。', 6: '上九：敦艮，吉。'}, '001011': {0: '渐：女归吉，利贞。', 1: '初六：鸿渐于干，小子厉，有言，无咎。', 2: '六二：鸿渐于磐，饮食衎衎，吉。', 3: '九三：鸿渐于陆，夫征不复，妇孕不育，凶；利御寇。', 4: '六四：鸿渐于木，或得其桷，无咎。', 5: '九五：鸿渐于陵，妇三岁不孕，终莫之胜，吉。', 6: '上九：鸿渐于陆，其羽可用为仪，吉。'}, '110100': {0: '归妹：征凶，无攸利。', 1: '初九：归妹以娣，跛能履，征吉。', 2: '九二：眇能视，利幽人之贞。', 3: '六三：归妹以须，反归以娣。', 4: '九四：归妹愆期，迟归有时。', 5: '六五：帝乙归妹，其君之袂，不如其娣之袂良，月几望，吉。', 6: '上六：女承筐无实，士刲羊无血，无攸利。'}, '101100': {0: '丰：亨，王假之，勿忧，宜日中。', 1: '初九：遇其配主，虽旬无咎，往有尚。', 2: '六二：丰其蔀，日中见斗，往得疑疾，有孚发若，吉。', 3: '九三：丰其沛，日中见沬，折其右肱，无咎。', 4: '九四：丰其蔀，日中见斗，遇其夷主，吉。', 5: '六五：来章，有庆誉，吉。', 6: '上六：丰其屋，蔀其家，闚其户，阒其无人，三岁不觌，凶。'}, '001101': {0: '旅：小亨，旅贞吉。', 1: '初六：旅琐琐，斯其所取灾。', 2: '六二：旅即次，怀其资，得童仆贞。', 3: '九三：旅焚其次，丧其童仆，贞厉。', 4: '九四：旅于处，得其资斧，我心不快。', 5: '六五：射雉一矢亡，终以誉命。', 6: '上九：鸟焚其巢，旅人先笑后号啕。丧牛于易，凶。'}, '011011': {0: '巽：小亨，利攸往，利见大人。', 1: '初六：进退，利武人之贞。', 2: '九二：巽在床下，用史巫纷若，吉，无咎。', 3: '九三：频巽，吝。', 4: '六四：悔亡，田获三品。', 5: '九五：贞吉悔亡，无不利。无初有终，先庚三日，后庚三日，吉。', 6: '上九：巽在床下，丧其资斧，贞凶。'}, '110110': {0: '兑：亨，利贞。', 1: '初九：和兑，吉。', 2: '九二：孚兑，吉，悔亡。', 3: '六三：来兑，凶。', 4: '九四：商兑，未宁，介疾有喜。', 5: '九五：孚于剥，有厉。', 6: '上六：引兑。'}, '010011': {0: '涣：亨。王假有庙，利涉大川，利贞。', 1: '初六：用拯马壮，吉。', 2: '九二：涣奔其机，悔亡。', 3: '六三：涣其躬，无悔。', 4: '六四：涣其群，元吉。涣有丘，匪夷所思。', 5: '九五：涣汗其大号，涣王居，无咎。', 6: '上九：涣其血，去逖出，无咎。'}, '110010': {0: '节：亨。苦节，不可贞。', 1: '初九：不出户庭，无咎。', 2: '九二：不出门庭，凶。', 3: '六三：不节若，则嗟若，无咎。', 4: '六四：安节，亨。', 5: '九五：甘节，吉；往有尚。', 6: '上六：苦节，贞凶，悔亡。'}, '110011': {0: '中孚：豚鱼吉，利涉大川，利贞。', 1: '初九：虞吉，有它不燕。', 2: '九二：鸣鹤在阴，其子和之，我有好爵，吾与尔靡之。', 3: '六三：得敌，或鼓或罢，或泣或歌。', 4: '六四：月几望，马匹亡，无咎。', 5: '九五：有孚挛如，无咎。', 6: '上九：翰音登于天，贞凶。'}, '001100': {0: '小过：亨，利贞，可小事，不可大事。飞鸟遗之音，不宜上，宜下，大吉。', 1: '初六：飞鸟以凶。', 2: '六二：过其祖，遇其妣；不及其君，遇其臣；无咎。', 3: '九三：弗过防之，从或戕之，凶。', 4: '九四：无咎，弗过遇之。往厉必戒，勿用永贞。', 5: '六五：密云不雨，自我西郊，公弋取彼在穴。', 6: '上六：弗遇过之，飞鸟离之，凶，是谓灾眚。'}, '101010': {0: '既济：亨，小利贞，初吉终乱。', 1: '初九：曳其轮，濡其尾，无咎。', 2: '六二：妇丧其茀，勿逐，七日得。', 3: '九三：高宗伐鬼方，三年克之，小人勿用。', 4: '六四：繻有衣袽，终日戒。', 5: '九五：东邻杀牛，不如西邻之禴祭，实受其福。', 6: '上六：濡其首，厉。'}, '010101': {0: '未济：亨，小狐汔济，濡其尾，无攸利。', 1: '初六：濡其尾，吝。', 2: '九二：曳其轮，贞吉。', 3: '六三：未济，征凶，利涉大川。', 4: '九四：贞吉，悔亡，震用伐鬼方，三年有赏于大国。', 5: '六五：贞吉，无悔，君子之光，有孚，吉。', 6: '上九：有孚于饮酒，无咎，濡其首，有孚失是。'}}
    DICT_GUA2TEXT2 = {'乾': {0: '乾：元亨，利贞。', 1: '初九：潜龙，勿用。', 2: '九二：见龙在田，利见大人。', 3: '九三：君子终日乾乾，夕惕若，厉，无咎。', 4: '九四：或跃在渊，无咎。', 5: '九五：飞龙在天，利见大人。', 6: '上九：亢龙有悔。', 7: '用九：见群龙无首，吉。'},
                      '坤': {0: '坤：元亨，利牝马之贞。君子有攸往，先迷后得主，利西南得朋，东北丧朋。安贞，吉。', 1: '初六：履霜，坚冰至。', 2: '六二：直，方，大，不习无不利。', 3: '六三：含章可贞。或从王事，无成有终。', 4: '六四：括囊；无咎，无誉。', 5: '六五：黄裳，元吉。', 6: '上六：龙战于野，其血玄黄。', 7: '用六：利永贞。'},
                      '屯': {0: '屯：元亨，利贞，勿用有攸往，利建侯。', 1: '初九：磐桓；利居贞，利建侯。', 2: '六二：屯如邅如，乘马班如。匪寇婚媾，女子贞不字，十年乃字。', 3: '六三：即鹿无虞，惟入于林中，君子几不如舍，往吝。', 4: '六四：乘马班如，求婚媾，往吉，无不利。', 5: '九五：屯其膏，小贞吉，大贞凶。', 6: '上六：乘马班如，泣血涟如。'},
                      '蒙': {0: '蒙：亨。匪我求童蒙，童蒙求我。初筮告，再三渎，渎则不告。利贞。', 1: '初六：发蒙，利用刑人，用说桎梏，以往吝。', 2: '九二：包蒙吉；纳妇吉；子克家。', 3: '六三：勿用取女；见金夫，不有躬，无攸利。', 4: '六四：困蒙，吝。', 5: '六五：童蒙，吉。', 6: '上九：击蒙；不利为寇，利御寇。'}, '需': {0: '需：有孚，光亨，贞吉。利涉大川。', 1: '初九：需于郊。利用恒，无咎。', 2: '九二：需于沙。小有言，终吉。', 3: '九三：需于泥，致寇至。', 4: '六四：需于血，出自穴。', 5: '九五：需于酒食，贞吉。', 6: '上六：入于穴，有不速之客三人来，敬之终吉。'}, '讼': {0: '讼：有孚，窒。惕中吉。终凶。利见大人，不利涉大川。', 1: '初六：不永所事，小有言，终吉。', 2: '九二：不克讼，归而逋，其邑人三百户，无眚。', 3: '六三：食旧德，贞厉，终吉，或从王事，无成。', 4: '九四：不克讼，复即命渝，安贞吉。', 5: '九五：讼元吉。', 6: '上九：或锡之鞶带，终朝三褫之。'}, '师': {0: '师：贞，丈人，吉无咎。', 1: '初六：师出以律，否臧凶。', 2: '九二：在师中吉，无咎，王三锡命。', 3: '六三：师或舆尸，凶。', 4: '六四：师左次，无咎。', 5: '六五：田有禽，利执言，无咎。长子帅师，弟子舆尸，贞凶。', 6: '上六：大君有命，开国承家，小人勿用。'}, '比': {0: '比：吉。原筮元永贞，无咎。不宁方来，后夫凶。', 1: '初六：有孚，比之，无咎。有孚盈缶，终来有它吉。', 2: '六二：比之自内，贞吉。', 3: '六三：比之匪人。', 4: '六四：外比之，贞吉。', 5: '九五：显比，王用三驱，失前禽。邑人不诫，吉。', 6: '上六：比之无首，凶。'}, '小畜': {0: '小畜：亨。密云不雨，自我西郊。', 1: '初九：复自道，何其咎，吉。', 2: '九二：牵复，吉。', 3: '九三：舆说辐，夫妻反目。', 4: '六四：有孚，血去惕出，无咎。', 5: '九五：有孚挛如，富以其邻。', 6: '上九：既雨既处，尚德载，妇贞厉。月几望，君子征凶。'}, '履': {0: '履虎尾，不咥人，亨。', 1: '初九：素履，往无咎。', 2: '九二：履道坦坦，幽人贞吉。', 3: '六三：眇能视，跛能履，履虎尾，咥人，凶。武人为于大君。', 4: '九四：履虎尾，诉诉，终吉。', 5: '九五：夬履，贞厉。', 6: '上九：视履考祥，其旋元吉。'}, '泰': {0: '泰：小往大来，吉亨。', 1: '初九：拔茅茹，以其汇，征吉。', 2: '九二：包荒，用冯河，不遐遗，朋亡，得尚于中行。', 3: '九三：无平不陂，无往不复，艰贞无咎。勿恤其孚，于食有福。', 4: '六四：翩翩，不富，以其邻，不戒以孚。', 5: '六五：帝乙归妹，以祉元吉。', 6: '上六：城复于隍，勿用师。自邑告命，贞吝。'}, '否': {0: '否之匪人，不利君子贞，大往小来。', 1: '初六：拔茅茹，以其汇，贞吉亨。', 2: '六二：包承。小人吉，大人否，亨。', 3: '六三：包羞。', 4: '九四：有命，无咎，畴离祉。', 5: '九五：休否，大人吉。其亡其亡，系于苞桑。', 6: '上九：倾否，先否后喜。'}, '同人': {0: '同人于野，亨。利涉大川，利君子贞。', 1: '初九：同人于门，无咎。', 2: '六二：同人于宗，吝。', 3: '九三：伏戎于莽，升其高陵，三岁不兴。', 4: '九四：乘其墉，弗克攻，吉。', 5: '九五：同人，先号啕而后笑。大师克相遇。', 6: '上九：同人于郊，无悔。'}, '大有': {0: '大有：元亨。', 1: '初九：无交害，匪咎，艰则无咎。', 2: '九二：大车以载，有攸往，无咎。', 3: '九三：公用亨于天子，小人弗克。', 4: '九四：匪其彭，无咎。', 5: '六五：厥孚交如，威如；吉。', 6: '上九：自天佑之，吉无不利。'}, '谦': {0: '谦：亨，君子有终。', 1: '初六：谦谦君子，用涉大川，吉。', 2: '六二：鸣谦，贞吉。', 3: '九三：劳谦，君子有终，吉。', 4: '六四：无不利，撝谦。', 5: '六五：不富，以其邻，利用侵伐，无不利。', 6: '上六：鸣谦，利用行师，征邑国。'}, '豫': {0: '豫：利建侯，行师。', 1: '初六：鸣豫，凶。', 2: '六二：介于石，不终日，贞吉。', 3: '六三：盱豫，悔。迟有悔。', 4: '九四：由豫，大有得。勿疑。朋盍簪。', 5: '六五：贞疾，恒不死。', 6: '上六：冥豫，成有渝，无咎。'}, '随': {0: '随：元亨利贞，无咎。', 1: '初九：官有渝，贞吉。出门交有功。', 2: '六二：系小子，失丈夫。', 3: '六三：系丈夫，失小子。随有求得，利居贞。', 4: '九四：随有获，贞凶。有孚在道，以明，何咎。', 5: '九五：孚于嘉，吉。', 6: '上六：拘系之，乃从维之。王用亨于西山。'}, '蛊': {0: '蛊：元亨，利涉大川。先甲三日，后甲三日。', 1: '初六：干父之蛊，有子，考无咎，厉终吉。', 2: '九二：干母之蛊，不可贞。', 3: '九三：干父之蛊，小有悔，无大咎。', 4: '六四：裕父之蛊，往见吝。', 5: '六五：干父之蛊，用誉。', 6: '上九：不事王侯，高尚其事。'}, '临': {0: '临：元，亨，利，贞。至于八月有凶。', 1: '初九：咸临，贞吉。', 2: '九二：咸临，吉无不利。', 3: '六三：甘临，无攸利。既忧之，无咎。', 4: '六四：至临，无咎。', 5: '六五：知临，大君之宜，吉。', 6: '上六：敦临，吉无咎。'}, '观': {0: '观：盥而不荐，有孚顒若。', 1: '初六：童观，小人无咎，君子吝。', 2: '六二：闚观，利女贞。', 3: '六三：观我生，进退。', 4: '六四：观国之光，利用宾于王。', 5: '九五：观我生，君子无咎。', 6: '上九：观其生，君子无咎。'}, '噬嗑': {0: '噬嗑：亨。利用狱。', 1: '初九：屦校灭趾，无咎。', 2: '六二：噬肤灭鼻，无咎。', 3: '六三：噬腊肉，遇毒；小吝，无咎。', 4: '九四：噬乾胏，得金矢，利艰贞，吉。', 5: '六五：噬乾肉，得黄金，贞厉，无咎。', 6: '上九：何校灭耳，凶。'}, '贲': {0: '贲：亨。小利有攸往。', 1: '初九：贲其趾，舍车而徒。', 2: '六二：贲其须。', 3: '九三：贲如濡如，永贞吉。', 4: '六四：贲如皤如，白马翰如，匪寇婚媾。', 5: '六五：贲于丘园，束帛戋戋，吝，终吉。', 6: '上九：白贲，无咎。'}, '剥': {0: '剥：不利有攸往。', 1: '初六：剥床以足，蔑贞凶。', 2: '六二：剥床以辨，蔑贞凶。', 3: '六三：剥之，无咎。', 4: '六四：剥床以肤，凶。', 5: '六五：贯鱼，以宫人宠，无不利。', 6: '上九：硕果不食，君子得舆，小人剥庐。'}, '复': {0: '复：亨。出入无疾，朋来无咎。反复其道，七日来复，利有攸往。', 1: '初九：不远复，无祗悔，元吉。', 2: '六二：休复，吉。', 3: '六三：频复，厉无咎。', 4: '六四：中行独复。', 5: '六五：敦复，无悔。', 6: '上六：迷复，凶，有灾眚。用行师，终有大败，以其国君，凶；至于十年，不克征。'}, '无妄': {0: '无妄：元亨，利贞。其匪正有眚，不利有攸往。', 1: '初九：无妄，往吉。', 2: '六二：不耕获，不灾畲，则利有攸往。', 3: '六三：无妄之灾，或系之牛，行人之得，邑人之灾。', 4: '九四：可贞，无咎。', 5: '九五：无妄之疾，勿药有喜。', 6: '上九：无妄，行有眚，无攸利。'}, '大畜': {0: '大畜：利贞，不家食吉，利涉大川。', 1: '初九：有厉利已。', 2: '九二：舆说輹。', 3: '九三：良马逐，利艰贞。曰闲舆卫，利有攸往。', 4: '六四：童牛之牿，元吉。', 5: '六五：豶豕之牙，吉。', 6: '上九：何天之衢，亨。'}, '颐': {0: '颐：贞吉。观颐，自求口实。', 1: '初九：舍尔灵龟，观我朵颐，凶。', 2: '六二：颠颐，拂经，于丘颐，征凶。', 3: '六三：拂颐，贞凶，十年勿用，无攸利。', 4: '六四：颠颐，吉，虎视眈眈，其欲逐逐，无咎。', 5: '六五：拂经，居贞吉，不可涉大川。', 6: '上九：由颐，厉吉，利涉大川。'}, '大过': {0: '大过：栋桡，利有攸往，亨。', 1: '初六：藉用白茅，无咎。', 2: '九二：枯杨生稊，老夫得其女妻，无不利。', 3: '九三：栋桡，凶。', 4: '九四：栋隆，吉；有它吝。', 5: '九五：枯杨生华，老妇得士夫，无咎无誉。', 6: '上六：过涉灭顶，凶，无咎。'}, '坎': {0: '坎：习坎，有孚，维心亨，行有尚。', 1: '初六：习坎，入于坎窞，凶。', 2: '九二：坎有险，求小得。', 3: '六三：来之坎坎，险且枕，入于坎窞，勿用。', 4: '六四：樽酒簋贰，用缶，纳约自牖，终无咎。', 5: '九五：坎不盈，祗既平，无咎。', 6: '上六：系用徽纆，置于丛棘，三岁不得，凶。'}, '离': {0: '离：利贞，亨。畜牝牛，吉。', 1: '初九：履错然，敬之无咎。', 2: '六二：黄离，元吉。', 3: '九三：日昃之离，不鼓缶而歌，则大耋之嗟，凶。', 4: '九四：突如其来如，焚如，死如，弃如。', 5: '六五：出涕沱若，戚嗟若，吉。', 6: '上九：王用出征，有嘉折首，获匪其丑，无咎。'}, '咸': {0: '咸，亨，利贞，取女吉。', 1: '初六，咸其拇。', 2: '六二，咸其腓，凶，居吉。', 3: '九三，咸其股，执其随，往吝。', 4: '九四，贞吉，悔亡，憧憧往来，朋从尔思。', 5: '九五，咸其脢，无悔。', 6: '上六，咸其辅颊舌。'}, '恒': {0: '恒：亨，无咎，利贞，利有攸往。', 1: '初六：浚恒，贞凶，无攸利。', 2: '九二：悔亡。', 3: '九三：不恒其德，或承之羞，贞吝。', 4: '九四：田无禽。', 5: '六五：恒其德，贞，妇人吉，夫子凶。', 6: '上六：振恒，凶。'}, '遯': {0: '遯：亨，小利贞。', 1: '初六：遯尾，厉，勿用有攸往。', 2: '六二：执之用黄牛之革，莫之胜说。', 3: '九三：系遯，有疾厉，畜臣妾吉。', 4: '九四：好遯，君子吉，小人否。', 5: '九五：嘉遯，贞吉。', 6: '上九：肥遯，无不利。'}, '大壮': {0: '大壮：利贞。', 1: '初九：壮于趾，征凶，有孚。', 2: '九二：贞吉。', 3: '九三：小人用壮，君子用罔，贞厉。羝羊触藩，羸其角。', 4: '九四：贞吉悔亡，藩决不羸，壮于大舆之輹。', 5: '六五：丧羊于易，无悔。', 6: '上六：羝羊触藩，不能退，不能遂，无攸利，艰则吉。'}, '晋': {0: '晋：康侯用锡马蕃庶，昼日三接。', 1: '初六：晋如，摧如，贞吉。罔孚，裕无咎。', 2: '六二：晋如，愁如，贞吉。受兹介福，于其王母。', 3: '六三：众允，悔亡。', 4: '九四：晋如硕鼠，贞厉。', 5: '六五：悔亡，失得勿恤，往吉，无不利。', 6: '上九：晋其角，维用伐邑，厉吉无咎，贞吝。'}, '明夷': {0: '明夷：利艰贞。', 1: '初九：明夷于飞，垂其翼。君子于行，三日不食，有攸往，主人有言。', 2: '六二：明夷，夷于左股，用拯马壮，吉。', 3: '九三：明夷于南狩，得其大首，不可疾贞。', 4: '六四：入于左腹，获明夷之心，出于门庭。', 5: '六五：箕子之明夷，利贞。', 6: '上六：不明晦，初登于天，后入于地。'}, '家人': {0: '家人：利女贞。', 1: '初九：闲有家，悔亡。', 2: '六二：无攸遂，在中馈，贞吉。', 3: '九三：家人嗃嗃，悔厉吉；妇子嘻嘻，终吝。', 4: '六四：富家，大吉。', 5: '九五：王假有家，勿恤，往吉。', 6: '上九：有孚威如，终吉。'}, '睽': {0: '睽：小事吉。', 1: '初九：悔亡，丧马勿逐，自复；见恶人无咎。', 2: '九二：遇主于巷，无咎。', 3: '六三：见舆曳，其牛掣，其人天且劓，无初有终。', 4: '九四：睽孤，遇元夫，交孚，厉无咎。', 5: '六五：悔亡，厥宗噬肤，往何咎。', 6: '上九：睽孤，见豕负涂，载鬼一车，先张之弧，后说之弧，匪寇婚媾，往遇雨则吉。'}, '蹇': {0: '蹇：利西南，不利东北；利见大人，贞吉。', 1: '初六：往蹇，来誉。', 2: '六二：王臣蹇蹇，匪躬之故。', 3: '九三：往蹇来反。', 4: '六四：往蹇来连。', 5: '九五：大蹇朋来。', 6: '上六：往蹇来硕，吉；利见大人。'}, '解': {0: '解：利西南，无所往，其来复吉。有攸往，夙吉。', 1: '初六：无咎。', 2: '九二：田获三狐，得黄矢，贞吉。', 3: '六三：负且乘，致寇至，贞吝。', 4: '九四：解而拇，朋至斯孚。', 5: '六五：君子维有解，吉；有孚于小人。', 6: '上六：公用射隼于高墉之上，获之，无不利。'}, '损': {0: '损：有孚，元吉，无咎，可贞，利有攸往。曷之用，二簋可用享。', 1: '初九：巳事遄往，无咎，酌损之。', 2: '九二：利贞，征凶，弗损，益之。', 3: '六三：三人行，则损一人；一人行，则得其友。', 4: '六四：损其疾，使遄有喜，无咎。', 5: '六五：或益之，十朋之龟弗克违，元吉。', 6: '上九：弗损益之，无咎，贞吉，有攸往，得臣无家。'}, '益': {0: '益：利有攸往，利涉大川。', 1: '初九：利用为大作，元吉，无咎。', 2: '六二：或益之，十朋之龟弗克违，永贞吉。王用享于帝，吉。', 3: '六三：益之用凶事，无咎。有孚中行，告公用圭。', 4: '六四：中行，告公从。利用为依迁国。', 5: '九五：有孚惠心，勿问元吉。有孚惠我德。', 6: '上九：莫益之，或击之，立心勿恒，凶。'}, '夬': {0: '夬：扬于王庭，孚号，有厉，告自邑，不利即戎，利有攸往。', 1: '初九：壮于前趾，往不胜为咎。', 2: '九二：惕号，莫夜有戎，勿恤。', 3: '九三：壮于頄，有凶。君子夬夬，独行，遇雨，若濡，有愠，无咎。', 4: '九四：臀无肤，其行次且。牵羊悔亡，闻言不信。', 5: '九五：苋陆夬夬，中行无咎。', 6: '上六：无号，终有凶。'}, '姤': {0: '姤：女壮，勿用取女。', 1: '初六：系于金柅，贞吉，有攸往，见凶，羸豕孚蹢躅。', 2: '九二：包有鱼，无咎，不利宾。', 3: '九三：臀无肤，其行次且，厉，无大咎。', 4: '九四：包无鱼，起凶。', 5: '九五：以杞包瓜，含章，有陨自天。', 6: '上九：姤其角，吝，无咎。'}, '萃': {0: '萃：亨。王假有庙，利见大人，亨，利贞。用大牲吉，利有攸往。', 1: '初六：有孚不终，乃乱乃萃，若号一握为笑，勿恤，往无咎。', 2: '六二：引吉，无咎，孚乃利用禴。', 3: '六三：萃如，嗟如，无攸利，往无咎，小吝。', 4: '九四：大吉，无咎。', 5: '九五：萃有位，无咎。匪孚，元永贞，悔亡。', 6: '上六：赍咨涕洟，无咎。'}, '升': {0: '升：元亨，用见大人，勿恤，南征吉。', 1: '初六：允升，大吉。', 2: '九二：孚乃利用禴，无咎。', 3: '九三：升虚邑。', 4: '六四：王用亨于岐山，吉无咎。', 5: '六五：贞吉，升阶。', 6: '上六：冥升，利于不息之贞。'}, '困': {0: '困：亨，贞，大人吉，无咎，有言不信。', 1: '初六：臀困于株木，入于幽谷，三岁不觌。', 2: '九二：困于酒食，朱绂方来，利用享祀，征凶，无咎。', 3: '六三：困于石，据于蒺蔾，入于其宫，不见其妻，凶。', 4: '九四：来徐徐，困于金车，吝，有终。', 5: '九五：劓刖，困于赤绂，乃徐有说，利用祭祀。', 6: '上六：困于葛藟，于臲卼，曰动悔。有悔，征吉。'}, '井': {0: '井：改邑不改井，无丧无得，往来井井。汔至，亦未繘井，羸其瓶，凶。', 1: '初六：井泥不食，旧井无禽。', 2: '九二：井谷射鲋，瓮敝漏。', 3: '九三：井渫不食，为我心恻，可用汲，王明，并受其福。', 4: '六四：井甃，无咎。', 5: '九五：井冽，寒泉食。', 6: '上六：井收勿幕，有孚元吉。'}, '革': {0: '革：巳日乃孚，元亨利贞，悔亡。', 1: '初九：巩用黄牛之革。', 2: '六二：巳日乃革之，征吉，无咎。', 3: '九三：征凶，贞厉，革言三就，有孚。', 4: '九四：悔亡，有孚改命，吉。', 5: '九五：大人虎变，未占有孚。', 6: '上六：君子豹变，小人革面，征凶，居贞吉。'}, '鼎': {0: '鼎：元吉，亨。', 1: '初六：鼎颠趾，利出否，得妾以其子，无咎。', 2: '九二：鼎有实，我仇有疾，不我能即，吉。', 3: '九三：鼎耳革，其行塞，雉膏不食，方雨亏悔，终吉。', 4: '九四：鼎折足，覆公餗，其形渥，凶。', 5: '六五：鼎黄耳，金铉，利贞。', 6: '上九：鼎玉铉，大吉，无不利。'}, '震': {0: '震：亨。震来虩虩，笑言哑哑。震惊百里，不丧匕鬯。', 1: '初九：震来虩虩，后笑言哑哑，吉。', 2: '六二：震来厉，亿丧贝，跻于九陵，勿逐，七日得。', 3: '六三：震苏苏，震行无眚。', 4: '九四：震遂泥。', 5: '六五：震往来厉，亿无丧，有事。', 6: '上六：震索索，视矍矍，征凶。震不于其躬，于其邻，无咎。婚媾有言。'}, '艮': {0: '艮：艮其背，不获其身，行其庭，不见其人，无咎。', 1: '初六：艮其趾，无咎，利永贞。', 2: '六二：艮其腓，不拯其随，其心不快。', 3: '九三：艮其限，列其夤，厉薰心。', 4: '六四：艮其身，无咎。', 5: '六五：艮其辅，言有序，悔亡。', 6: '上九：敦艮，吉。'}, '渐': {0: '渐：女归吉，利贞。', 1: '初六：鸿渐于干，小子厉，有言，无咎。', 2: '六二：鸿渐于磐，饮食衎衎，吉。', 3: '九三：鸿渐于陆，夫征不复，妇孕不育，凶；利御寇。', 4: '六四：鸿渐于木，或得其桷，无咎。', 5: '九五：鸿渐于陵，妇三岁不孕，终莫之胜，吉。', 6: '上九：鸿渐于陆，其羽可用为仪，吉。'}, '归妹': {0: '归妹：征凶，无攸利。', 1: '初九：归妹以娣，跛能履，征吉。', 2: '九二：眇能视，利幽人之贞。', 3: '六三：归妹以须，反归以娣。', 4: '九四：归妹愆期，迟归有时。', 5: '六五：帝乙归妹，其君之袂，不如其娣之袂良，月几望，吉。', 6: '上六：女承筐无实，士刲羊无血，无攸利。'}, '丰': {0: '丰：亨，王假之，勿忧，宜日中。', 1: '初九：遇其配主，虽旬无咎，往有尚。', 2: '六二：丰其蔀，日中见斗，往得疑疾，有孚发若，吉。', 3: '九三：丰其沛，日中见沬，折其右肱，无咎。', 4: '九四：丰其蔀，日中见斗，遇其夷主，吉。', 5: '六五：来章，有庆誉，吉。', 6: '上六：丰其屋，蔀其家，闚其户，阒其无人，三岁不觌，凶。'}, '旅': {0: '旅：小亨，旅贞吉。', 1: '初六：旅琐琐，斯其所取灾。', 2: '六二：旅即次，怀其资，得童仆贞。', 3: '九三：旅焚其次，丧其童仆，贞厉。', 4: '九四：旅于处，得其资斧，我心不快。', 5: '六五：射雉一矢亡，终以誉命。', 6: '上九：鸟焚其巢，旅人先笑后号啕。丧牛于易，凶。'}, '巽': {0: '巽：小亨，利攸往，利见大人。', 1: '初六：进退，利武人之贞。', 2: '九二：巽在床下，用史巫纷若，吉，无咎。', 3: '九三：频巽，吝。', 4: '六四：悔亡，田获三品。', 5: '九五：贞吉悔亡，无不利。无初有终，先庚三日，后庚三日，吉。', 6: '上九：巽在床下，丧其资斧，贞凶。'}, '兑': {0: '兑：亨，利贞。', 1: '初九：和兑，吉。', 2: '九二：孚兑，吉，悔亡。', 3: '六三：来兑，凶。', 4: '九四：商兑，未宁，介疾有喜。', 5: '九五：孚于剥，有厉。', 6: '上六：引兑。'}, '涣': {0: '涣：亨。王假有庙，利涉大川，利贞。', 1: '初六：用拯马壮，吉。', 2: '九二：涣奔其机，悔亡。', 3: '六三：涣其躬，无悔。', 4: '六四：涣其群，元吉。涣有丘，匪夷所思。', 5: '九五：涣汗其大号，涣王居，无咎。', 6: '上九：涣其血，去逖出，无咎。'}, '节': {0: '节：亨。苦节，不可贞。', 1: '初九：不出户庭，无咎。', 2: '九二：不出门庭，凶。', 3: '六三：不节若，则嗟若，无咎。', 4: '六四：安节，亨。', 5: '九五：甘节，吉；往有尚。', 6: '上六：苦节，贞凶，悔亡。'}, '中孚': {0: '中孚：豚鱼吉，利涉大川，利贞。', 1: '初九：虞吉，有它不燕。', 2: '九二：鸣鹤在阴，其子和之，我有好爵，吾与尔靡之。', 3: '六三：得敌，或鼓或罢，或泣或歌。', 4: '六四：月几望，马匹亡，无咎。', 5: '九五：有孚挛如，无咎。', 6: '上九：翰音登于天，贞凶。'}, '小过': {0: '小过：亨，利贞，可小事，不可大事。飞鸟遗之音，不宜上，宜下，大吉。', 1: '初六：飞鸟以凶。', 2: '六二：过其祖，遇其妣；不及其君，遇其臣；无咎。', 3: '九三：弗过防之，从或戕之，凶。', 4: '九四：无咎，弗过遇之。往厉必戒，勿用永贞。', 5: '六五：密云不雨，自我西郊，公弋取彼在穴。', 6: '上六：弗遇过之，飞鸟离之，凶，是谓灾眚。'}, '既济': {0: '既济：亨，小利贞，初吉终乱。', 1: '初九：曳其轮，濡其尾，无咎。', 2: '六二：妇丧其茀，勿逐，七日得。', 3: '九三：高宗伐鬼方，三年克之，小人勿用。', 4: '六四：繻有衣袽，终日戒。', 5: '九五：东邻杀牛，不如西邻之禴祭，实受其福。', 6: '上六：濡其首，厉。'}, '未济': {0: '未济：亨，小狐汔济，濡其尾，无攸利。', 1: '初六：濡其尾，吝。', 2: '九二：曳其轮，贞吉。', 3: '六三：未济，征凶，利涉大川。', 4: '九四：贞吉，悔亡，震用伐鬼方，三年有赏于大国。', 5: '六五：贞吉，无悔，君子之光，有孚，吉。', 6: '上九：有孚于饮酒，无咎，濡其首，有孚失是。'}}

    @staticmethod
    def gua_name(gua) -> str:
        return IChingData.DICT_GUA2NAME.get(gua)

    @staticmethod
    def gua_xiang(gua) -> str:
        return IChingData.DICT_GUA2XIANG.get(gua)

    @staticmethod
    def gua_ci(gua, yao) -> str:
        return IChingData.DICT_GUA2TEXT.get(gua).get(yao)


# turtle图形显示占卜结果
def show_results(gua_b, gua_c):
    global g1, g2
    g1 = GUA(-100)
    g2 = GUA(100)

    ht(); penup(); goto(0, 200)
    write("周易占卜", align="center", font=("隶书", 60, ("bold")))

    penup(); goto(0, 200)
    for ch in gua_b:
        g1.push(YAO(ch))
    if gua_b != gua_c:
        for ch in gua_c:
            g2.push(YAO(ch))

    result_guas, result_text = IChing.get_results(gua_b, gua_c)

    penup(); goto(0, -100)
    write(result_guas, align="center", font=("隶书", 40, ("bold")))
    penup(); goto(0, -130); color('red')
    write(result_text, align="center", font=("隶书", 20, ("bold")))

    penup(); goto(0, -200)
    yin(50, "black", "white")
    yin(50, "white", "black")
    return

# 阳爻阴爻图形
class YAO(Turtle):
    def __init__(self, ch):
        Turtle.__init__(self, shape="square", visible=False)
        self.pu()
        self.shapesize(1.2, 6 * 1.5, 2)
        if ch == '1':
            # 阳爻白色
            self.fillcolor(1, 1, 1)
        else:
            # 阴爻黑色
            self.fillcolor(0, 0, 0)
        self.st()


# 卦图形，每卦包含六爻
class GUA(list):
    def __init__(self, x):
        self.x = x

    def push(self, yao):
        yao.setx(self.x)
        yao.sety(-20 + 34 * len(self))
        self.append(yao)


def play():
    onkey(None, "space")
    clearscreen()
    main()


# 阴阳鱼小图
def yin(radius, color1, color2):
    speed('fastest')
    down()
    color("black", color1)
    begin_fill()
    circle(radius / 2., 180)
    circle(radius, 180)
    left(180)
    circle(-radius / 2., 180)
    end_fill()
    left(90)
    up()
    forward(radius * 0.35)
    right(90)
    down()
    color(color1, color2)
    begin_fill()
    circle(radius * 0.15)
    end_fill()
    left(90)
    up()
    backward(radius * 0.35)
    down()
    left(90)


# 测试算得各卦的概率
def test(n):
    # 算n次频率统计
    R = []
    t = time.perf_counter()
    for _ in range(n):
        gua_b, gua_c = IChing.get_guas()
        R.append(IChing.get_gua_name(gua_b))
    print('-------TEST-------')
    print('After %d times & %.8f seconds, the result is:' % (n, time.perf_counter() - t))
    C = Counter(R)
    print(C)
    L = list(C.values())
    print('From the result, mean=%.2f, std=%.2f, std/mean=%.2f' % (
    np.mean(L), np.std(L, ddof=1), np.std(L, ddof=1) / np.mean(L)))
    print('-----TEST END-----')


# main() - 占卜并图形化显示
def main():
    # 占得本卦，变卦
    gua_b, gua_c = IChing.get_guas()
    print([gua_b, IChing.get_gua_xiang(gua_b), IChing.get_gua_name(gua_b)])
    print([gua_c, IChing.get_gua_xiang(gua_c), IChing.get_gua_name(gua_c)])
    print(IChing.get_results(gua_b, gua_c))
    # 可视化占卜结果
    show_results(gua_b, gua_c)

    onkey(play, "space")
    listen()
    return "EVENTLOOP"


if __name__ == "__main__":
    msg = main()
    # 测试10000次，看各卦概率是否平均
    test(10000)
    mainloop()
